package com.plter.minios.mgrs {

	public class Manager {

		/**
		 * 事件数组
		 */
		private const HANDLERS:Vector.<Message>=new Vector.<Message>;

		public function Manager() {
		}

		/**
		 * 添加一个事件处理器，如果相同事件已经添加，则不做任何处理
		 * @param	channel	处理器订阅频道
		 * @param	handler		处理器
		 */
		public function addListener(name:String, handler:Function):void {
			if (!hasListener(name, handler)) {
				HANDLERS.push(new Message(name, handler));
			}
		}

		/**
		 * 删除一个事件处理器，如果检索到此事件，则删除，并返回true，否则返回false
		 * @param	channel	处理器订阅频道
		 * @param	handler		处理器
		 */
		public function removeListener(name:String, handler:Function):Boolean {
			var evt:Message;
			var length:int=HANDLERS.length;
			for (var i:int=0; i < length; i++) {
				evt=HANDLERS[i];
				if (evt.name == name && evt.handler == handler) {
					HANDLERS.splice(i, 1);
					return true;
				}
			}

			return false;
		}

		/**
		 * 检索是否有此事件，如果有则返回true，否则返回false
		 * @param	channel	处理器订阅频道
		 * @param	handler		处理器
		 */
		public function hasListener(channel:String, handler:Function):Boolean {
			var evt:Message;
			var length:int=HANDLERS.length;
			for (var i:int=0; i < length; i++) {
				evt=HANDLERS[i];
				if (evt.name == channel && evt.handler == handler) {
					return true;
				}
			}

			return false;
		}


		/**
		 * 调用一个处理器，如果函数成功调用，则返回true，否则返回false，在处理器中，如果想不想对该事件做出响应，则返回false
		 * @param	channel	处理器订阅频道
		 * @param	args		参数
		 * @return Boolean
		 */
		public function invokeListener(channel:String, ... args):Boolean {
			//是否调用成功
			var invokeSuc:Boolean=true;

			var evt:Message;
			var length:int=HANDLERS.length;

			for (var i:int=0; i < length; i++) {
				evt=HANDLERS[i];
				if (evt.name == channel) {
					if(String(evt.handler.apply(null, args))=="false"){
						invokeSuc=false;
					}
				}
			}

			return invokeSuc;
		}
	}
}